<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  



  <script>
   const a = {
     b:2,
     foo:function () {console.log(this.b);}
   }

   function b (foo) {
     foo()
   }

   b(a.foo)
  //  Grand.prototype.lastName = 'yang'
  //  function Grand(){
    
  //  }
  //  var grand = new Grand()

   
  //  Father.prototype = grand
  //  function Father(){
  //   this.name = 'hehe'
  //  }
  //  var father = new Father()

  //  Son.prototype = father
  //  function Son(){

  //  }

  //  var son = new Son()


  // function print(){
  //   console.log(foo);
  //   var foo = 2 
  //   console.log(foo);
  //   console.log(hel);
  // }



  // 深克隆  深度拷贝
  
  // function deepClone(origin,target){
  //   var target = target || {}
  //   var toStr = Object.prototype.toString
  //   var arrStr = "[Object Array]"

  //   for(var prop in origin){

  //     if(origin.hasOwnProperty(prop)){
  //       if(origin[prop] !== "null" && typeof(origin[prop])=='object') {

  //         if(toStr.call(origin[prop]) == arrStr){
  //           target[prop] = []
  //         }else{
  //           target[prop] = {}
  //         }
  //         // target[prop] = toStr.call(origin[prop]) == arrStr ? [] : {}
  //         deepClone(origin[prop],target[prop])

  //       }else{
  //         target[prop] = origin[prop]
  //       }
  //     }

  //   }
  // }





  // 三目运算符

  // 条件判断？ 是 ： 否 并会返回值
  




  // 数组常用方法   

    // 改变原数组  push, pop,shift,unshift,sort,reverse,  splice

    // 不改变原数组   concat，join ->  split ,toString, slice

  // 重写数组 push方法  在数组末尾添加数据
  
  // var arr = [1,2]

  // Array.prototype.push = function(){
  //   for( var i = 0 ; i < arguments.length; i++){
  //     this[this.length] = arguments[i]
  //   }
  //   return this.length
  // }


  // pop方法  将数组末位剪切
  // unshift  在数组最前面加数据

  // splice方法 （从第几位开始，截取多少长度，在切口处添加新的数据）
  // splice 数组可从负数为开始， 负数即为数组末尾开始 例 ：  -1 位 + arr.len = > 位数
  // var arr = [1,1,2,2,3,3]
  // arr.splice(1,2)



  // var arr = [1,3,10,4,5]

  // 1.必须写两个形参
  // 2.看返回值 1.当返回值为负数时，那么前面的数放在前面
              //2.为正数， 那么后面的数在前面
              //3.为0 ， 则不动
  //  arr.sort(function(a,b){
  //   if(a>b){
  //     return 1
  //   }else{
  //     return -1
  //   }
  // })
    // 简写  a-b>0 return a-b => return  a-b 升序 return  b-a 降序
  


  // 将一个有序的数组，乱序

  // arr.sort(function(){
  //   Math.random()-0.5 
  // })


// var arr = [1,3,4,23,21,11]

// arr.slice(2,5)  截取 [2,5)位

// arr.join("-")  将数组按 - 连接 返回字符串
// str.split("-")  和join互逆， 将 - 删除，各个部分返回成 数组



// 类数组 : 属性要为索引（数字）属性， 必须有length 属性，最好加上push方法


// var obj = {
//   "0" : 'a',
//   "1" : 'b',
//   "2" : 'c',
//   "length" : 3,
//   "push" : Array.prototype.push,
//   "splice": Array.prototype.splice
// }

// 判断数据类型
// function type(target) {
//   var template = {
//     "[object Array]" : "array",
//     "[object Object]" : "object",
//     "[object Number]" : "number - object",
//     "[object Boolean]" : "boolean - object",
//     "[object String]" : "string - object",

//   }

//   if(target === null){
//     return null
//   }

//   if(typeof(target) == 'function'){
//     return 'function'
//   }else if(typeof(target) == 'object'){
//     var str = Object.prototype.toString.call(target)
//     return template[str]
//   }else{
//     return typeof(target) //原始值
//   }

// }




// 数组去重   利用对象的属性唯一来实现

// var arr = [1,1,1,3,4,5,5,5,6,7,8,8,8,89]

// Array.prototype.unique = function () {

//   var temp = {};
//   var arr = [];

//   var len = this.length
//   for(var i = 0; i< len; i++){
//     if(!temp[this[i]]){
//       temp[this[i]] = 'abc';
//       arr.push(this[i])
//     }
//   }
//   return arr
// }


// try catch   try中有错即停止，后面代码不运行
// try{
//   console.log('a');
//   console.log(b);
//   console.log('c');
// }catch(e){
//   console.log(e.name+ ' :'+e.message);
// }


// ReferenceError 变量未声明就使用
// SyntaxError  发生语法解析错误



















  </script>
</body>
</html>